{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b84e1e81",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c0e3eaf346f64c89bc8bbe97e8884cf5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Fetching 2 files:   0%|          | 0/2 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1aa52c832e2d4eeda0c3116d1d063910",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "data/train-00000-of-00002.parquet:   0%|          | 0.00/150M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bba65afa2d744076a6daa50e2c99b212",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "data/train-00001-of-00002.parquet:   0%|          | 0.00/158M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from huggingface_hub import snapshot_download\n",
    "\n",
    "f = snapshot_download(\n",
    "    repo_id=\"mesolitica/Malaysian-Speech-Description-Timestamp-Instructions\",\n",
    "    repo_type='dataset',\n",
    "    allow_patterns=\"data/*.parquet\",\n",
    "    local_dir=\"./Malaysian-Speech-Description-Timestamp-Instructions\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "acda3802",
   "metadata": {},
   "outputs": [],
   "source": [
    "from glob import glob\n",
    "from tqdm import tqdm\n",
    "from multiprocess import Pool\n",
    "import itertools\n",
    "import zipfile\n",
    "import os\n",
    "\n",
    "def chunks(l, n):\n",
    "    for i in range(0, len(l), n):\n",
    "        yield (l[i: i + n], i // n)\n",
    "\n",
    "\n",
    "def multiprocessing(strings, function, cores=6, returned=True):\n",
    "    df_split = chunks(strings, len(strings) // cores)\n",
    "    pool = Pool(cores)\n",
    "    pooled = pool.map(function, df_split)\n",
    "    pool.close()\n",
    "    pool.join()\n",
    "\n",
    "    if returned:\n",
    "        return list(itertools.chain(*pooled))\n",
    "\n",
    "def loop(files):\n",
    "    files, _ = files\n",
    "    for zip_file_path in tqdm(files):\n",
    "        destination_folder = './'\n",
    "        with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:\n",
    "            zip_ref.extractall(destination_folder)\n",
    "        os.remove(zip_file_path)\n",
    "\n",
    "# files = glob('*.zip')\n",
    "# if len(files):\n",
    "#     multiprocessing(files, loop, cores = min(len(files), 20), returned = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "356cfc51",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/lib/python3/dist-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.17.3 and <1.25.0 is required for this version of SciPy (detected version 1.26.4\n",
      "  warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n"
     ]
    }
   ],
   "source": [
    "from transformers import AutoProcessor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "05a611b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "processor = AutoProcessor.from_pretrained(\"Qwen/Qwen2-Audio-7B-Instruct\")\n",
    "tokenizer = processor.tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3f73f0fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "from glob import glob\n",
    "import pandas as pd\n",
    "\n",
    "rows = []\n",
    "\n",
    "files = glob('Malaysian-Speech-Description-Timestamp-Instructions/data/*.parquet')\n",
    "for f in files:\n",
    "    df = pd.read_parquet(f).to_dict(orient = 'records')\n",
    "    rows.extend(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "07a8ff8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "445224"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(rows)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "1f0fe0c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import pandas as pd\n",
    "\n",
    "def loop(rows):\n",
    "    rows, _ = rows\n",
    "    data = []\n",
    "    for r in tqdm(rows):\n",
    "        f = r['audio_filename']\n",
    "        if not os.path.exists(f):\n",
    "            continue\n",
    "            \n",
    "        try:\n",
    "            conversation = [\n",
    "                {\"role\": \"user\", \"content\": [\n",
    "                    {\"type\": \"audio\", \"audio_url\": \"audio.wav\"},\n",
    "                    {\"type\": \"text\", \"text\": r['question']},\n",
    "                ]},\n",
    "                {\"role\": \"assistant\", \"content\": r['answer']},\n",
    "            ]\n",
    "            text = processor.apply_chat_template(conversation, tokenize=False)\n",
    "        except Exception as e:\n",
    "            continue\n",
    "        \n",
    "\n",
    "        data.append({\n",
    "            'text': text,\n",
    "            'audio': f,\n",
    "        })\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b667c078",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 26%|█████████████████████                                                           | 3902/14840 [00:00<00:01, 5745.42it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5659.13it/s]\n",
      " 65%|████████████████████████████████████████████████████▎                           | 9699/14840 [00:01<00:00, 5659.57it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5608.69it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5660.16it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5656.23it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5640.86it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5573.01it/s]\n",
      " 11%|████████▍                                                                       | 1562/14840 [00:00<00:02, 5330.64it/s]\n",
      " 65%|████████████████████████████████████████████████████                            | 9648/14840 [00:01<00:00, 5595.01it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5612.18it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5619.70it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5589.70it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5544.24it/s]\n",
      " 57%|█████████████████████████████████████████████▊                                  | 8494/14840 [00:01<00:01, 5687.26it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5667.14it/s]\n",
      " 73%|█████████████████████████████████████████████████████████▉                     | 10873/14840 [00:01<00:00, 5642.07it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5394.29it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5656.54it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5558.71it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5610.86it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5577.00it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████| 24/24 [00:00<00:00, 2918.28it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5649.40it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5667.94it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5541.16it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5676.12it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5675.94it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5675.28it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5626.47it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████| 14840/14840 [00:02<00:00, 5670.18it/s]\n"
     ]
    }
   ],
   "source": [
    "processed = multiprocessing(rows, loop, cores = 30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b7e7d3c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "445224"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(processed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e30cd7eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('prepare-Malaysian-Speech-Description-Timestamp-Instructions.json', 'w') as fopen:\n",
    "    json.dump(processed, fopen)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a5971c69",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'text': '<|im_start|>system\\nYou are a helpful assistant.<|im_end|>\\n<|im_start|>user\\nAudio 1: <|audio_bos|><|AUDIO|><|audio_eos|>\\ndescribe the audio include timestamps<|im_end|>\\n<|im_start|>assistant\\nAudio ini memulakan dengan nada mengajak dan menggalakkan. Pada cap masa 0.00-1.80, penutur mengajak warga Sabah, terutamanya masyarakat Tionghoa, untuk berganding bahu menjaga keamanan dan kemakmuran di kawasan mereka. Ini menunjukkan semangat kerjasama antara etnik dan komuniti.\\n\\nPada 7.10-12.08, penutur memberikan butiran tentang program yang diadakan di Dewan Sekolah Tinggi Cina Sabah, yang dihadiri oleh kira-kira 3,000 orang. Acara ini dimeriahkan dengan pelbagai persembahan kebudayaan, menunjukkan perpaduan budaya dan sokongan komuniti.\\n\\nNada keseluruhan audio ini adalah positif dan inklusif, dengan nada mengajak dan merayakan kepelbagaian budaya. Ia mencerminkan usaha untuk memupuk hubungan baik dan keharmonian antara komuniti yang berbeza di Sabah.<|im_end|>\\n',\n",
       " 'audio': 'filtered-24k_processed/00432-21/00432-21_22.mp3'}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "processed[0]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
